package com.situ.mall.service.impl;

import com.situ.mall.mapper.ProductMapper;
import com.situ.mall.pojo.Product;
import com.situ.mall.service.IProductService;
import com.situ.mall.util.JSONResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Random;

@Service
public class ProductServiceImpl implements IProductService {
    @Autowired
    private ProductMapper productMapper;
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public List<Product> selectByName(String name) {
        return productMapper.selectByName(name);
    }

    @Override
    public Product selectById(Integer id) {
        return productMapper.selectByPrimaryKey(id);
    }

    @Override
    public List<Product> selectByCategoryId(Integer id) {
        return productMapper.selectByCategoryId(id);
    }

    @Override
    public JSONResult secondkill(Integer productId, Integer userId) {
        //userId随机生成，代表不同用户参与productId这个商品的秒杀  [0,5000)
        userId = new Random().nextInt(5000);

        //库存key
        String quantityKey = "sk:" + productId + ":qt";
        //秒杀成功用户的key
        String userKey = "sk:" + productId + ":user";

        //获取库存,如果库存是null，代表秒杀还没有开始
        Integer quantity = (Integer) redisTemplate.opsForValue().get(quantityKey);
        if (quantity == null) {
            System.out.println("秒杀还没有开始，请等待");
            return JSONResult.error("秒杀还没有开始，请等待");
        }

        //判断用户是不是已经重复参加过秒杀
        if (redisTemplate.opsForSet().isMember(userKey, userId)) {
            System.out.println("已经秒杀成功，不能重复参与秒杀");
            return JSONResult.error("已经秒杀成功，不能重复参与秒杀");
        }

        //判断商品数量，库存<=0,秒杀已经结束
        if (quantity <= 0) {
            System.out.println("秒杀已经结束了");
            return JSONResult.error("秒杀已经结束了");
        }

        //秒杀过程
        //不使用事物
        if (quantity > 0){
            redisTemplate.opsForValue().decrement(quantityKey, 1);
            redisTemplate.opsForSet().add(userKey, userId);
            System.out.println("秒杀成功");
        }
        return JSONResult.ok("秒杀成功");
    }
}
